[小ネタ] CloudWatch Logs エクスポート用の S3 バケットを作成する CloudFormation テンプレート
アノテーション・テクニカルサポートチームの hato です。
サポート対応において CloudWatch Logs のログを S3 にエクスポートする方法を案内することがあります。
その際、バケットポリシー等が設定された S3 バケットが必要ですが、設定済みの S3 バケットを CloudFormation で一撃で作れると便利かなと思い、テンプレートを作成しましたので、小ネタとしてご紹介します。
テンプレート
AWSTemplateFormatVersion: 2010-09-09
Description: Deploys the S3 bucket required to export logs to CloudWatch Logs
Parameters:
FilesRetention:
Type: Number
Description: Retention period for exported objects
Default: 30
Resources:
Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub 'cloudwatch-logs-exporter-bucket-${AWS::AccountId}'
LifecycleConfiguration:
Rules:
- Id: DeleteOldFiles
Status: Enabled
ExpirationInDays: !Ref FilesRetention
BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref Bucket
PolicyDocument: !Sub |
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "s3:GetBucketAcl",
"Effect": "Allow",
"Resource": "${Bucket.Arn}",
"Principal": { "Service": "logs.${AWS::Region}.amazonaws.com" },
"Condition": {
"StringEquals": {
"aws:SourceAccount": [
"${AWS::AccountId}"
]
},
"ArnLike": {
"aws:SourceArn": [
"arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:*"
]
}
}
},
{
"Action": "s3:PutObject" ,
"Effect": "Allow",
"Resource": "${Bucket.Arn}/*",
"Principal": { "Service": "logs.${AWS::Region}.amazonaws.com" },
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control",
"aws:SourceAccount": [
"${AWS::AccountId}"
]
},
"ArnLike": {
"aws:SourceArn": [
"arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:*"
]
}
}
}
]
}
Outputs:
CloudWatchLogsExporterBucketName:
Description: CloudWatch Logs Exporter Bucket Name
Value: !Ref Bucket
Export:
Name: CloudWatchLogsExporterBucketName
かんたんな使い方
-
上記テンプレートを任意の名前(例:
cwlogs-exporttasks-s3
)でテキストファイルとして保存 -
CloudFormation コンソールの
「テンプレートファイルのアップロード」からアップロード
- 任意のスタック名と
FilesRetention
(保持期間※)を指定してスタックを作成
※S3 にエクスポートしたログの保持期間となります。
- エクスポートの際は作成した S3 バケットを指定します。
(バケット名はcloudwatch-logs-exporter-bucket-<アカウントID>
です)
解説
S3 バケット名はcloudwatch-logs-exporter-bucket-<アカウントID>
となります。
S3 のアクセス許可(バケットポリシー)は CloudWatch Logs と S3 バケットが同一アカウントにある場合の公式サンプルをほぼそのまま使用しています。
置換が必要な AWS アカウント ID 等は擬似パラメータで自動設定しています。
AWS 公式ドキュメントのバケットポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "s3:GetBucketAcl",
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-exported-logs",
"Principal": { "Service": "logs.Region.amazonaws.com" },
"Condition": {
"StringEquals": {
"aws:SourceAccount": [
"AccountId1",
"AccountId2",
...
]
},
"ArnLike": {
"aws:SourceArn": [
"arn:aws:logs:Region:AccountId1:log-group:*",
"arn:aws:logs:Region:AccountId2:log-group:*",
...
]
}
}
},
{
"Action": "s3:PutObject" ,
"Effect": "Allow",
"Resource": "arn:aws:s3:::my-exported-logs/*",
"Principal": { "Service": "logs.Region.amazonaws.com" },
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control",
"aws:SourceAccount": [
"AccountId1",
"AccountId2",
...
]
},
"ArnLike": {
"aws:SourceArn": [
"arn:aws:logs:Region:AccountId1:log-group:*",
"arn:aws:logs:Region:AccountId2:log-group:*",
...
]
}
}
}
]
}
保持期間の設定は、S3 ライフサイクルルール(オブジェクトの有効期限)を使用しています。
オブジェクトの有効期限 - Amazon Simple Storage Service
最後に
この記事が誰かのお役にたてば幸いです。
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイト をぜひご覧ください。